實體方法與類別方法:從字面上解釋的話,就是作用在實體的方法稱作實體方法,而作用在類別的方法稱為類別方法。
class Language
def say_hello
puts " Hello, world "
end
end
ruby = Language.new
js = Language.new # 這裡ruby,js 是實體
ruby.say_hello # 印出 Hello, world
js.say_hello # 印出 Hello, world
class Language
class << self
def introduction
puts " no pain no gain "
end
end
def self.say_hello
puts " Hello, world "
end
end
Language.introduction # 印出 no pain no gain
Language.say_hello # 印出 Hello, world
在學習到這裡時,有種原來學寫程式語言跟學講哪國語言一樣,各自有自己的文法:
第一個問題: self
你哪位?
第二個問題:一樣都是方法,但是要分寫法?
類別的方法存取限制主要為三種: public
、 protected
以及 private
。
就目前的理解,這三種限制的差別為:
class Dog
def bark
puts " 我不會說 '#{ self.delicious }' 所以只能 '汪汪汪' " # 這裡 self 可省略
end
protected
def delicious
"好吃好吃"
end
private
def sleep
"zzz..."
end
end
husky = Dog.new
husky.bark # 印出 我不會說 '好吃好吃' 所以只能 '汪汪汪'
husky.delicious # 印出 protected method `delicious' called for ...
husky.sleep # 印出 private method `sleep' called for ....
我們可以看到 delicious 身為 protected 的方法,在 class 中是能得出結果的,而且其結果一樣能藉由別的方法帶出來,然而直接在外面呼叫卻會失敗。
或是你也能這麼寫:
class Dog
def bark
puts "我不會說 '#{self.delicious}' 所以只能 '汪汪汪'"
end
def delicious
"好吃好吃"
end
def sleep
"zzz..."
end
protected :delicious
private :sleep
end
還記得之前 symbol
篇嗎?當我們在定義方法的時候,同時產生同名的 symbol
,這裡的存取控制其實就是方法而已,想必這裡是省略小括號了。
此文同步刊登於CJ-Han的網站